const Database = require('better-sqlite3');
const crypto = require('crypto');
const path = require('path');
const fs = require('fs');

// 数据库加密密钥管理（实际项目中应该更安全地管理）
function getEncryptionKey() {
  // 这里应该从安全的地方获取密钥，比如：
  // 1. 用户首次使用时设置的密码
  // 2. 从加密的配置文件中读取
  // 3. 使用硬件安全模块 (HSM)
  
  // 临时方案 - 实际项目中请替换为安全的密钥管理
  // 建议：让用户设置密码，然后使用 PBKDF2 生成密钥
  const defaultKey = process.env.DB_ENCRYPTION_KEY || 'your-very-strong-password-here-123456';
  return defaultKey;
}

// 使用 PBKDF2 从密码生成更安全的密钥
function generateSecureKey(password, salt = null) {
  if (!salt) {
    salt = crypto.randomBytes(16).toString('hex');
  }
  
  const iterations = 100000;
  const keyLength = 32; // 256 bits
  
  const key = crypto.pbkdf2Sync(
    password, 
    salt, 
    iterations, 
    keyLength, 
    'sha256'
  );
  
  return {
    key: key.toString('hex'),
    salt: salt
  };
}

async function initDatabase() {
  return new Promise((resolve, reject) => {
    try {
      // 数据库文件路径
      const dbPath = path.join(__dirname, '..', 'data', 'secure-database.sqlite');
      
      // 确保数据目录存在
      const fs = require('fs');
      const dbDir = path.dirname(dbPath);
      if (!fs.existsSync(dbDir)) {
        fs.mkdirSync(dbDir, { recursive: true });
      }

      // 获取加密密钥
      const encryptionKey = getEncryptionKey();
      
      // 创建加密的数据库连接
      const db = new Database(dbPath, {
        verbose: console.log,
        // 注意：better-sqlite3 本身不直接支持 SQLCipher
        // 这里需要使用 sqlcipher 或者 better-sqlite3 的加密扩展
        // 实际项目中建议使用 sqlcipher 包
      });

      // 如果使用 sqlcipher，可以这样设置密钥（需要安装 sqlcipher）
      // db.pragma('key = "' + encryptionKey + '"');
      
      // 执行数据库初始化
      initializeDatabaseSchema(db);
      
      console.log('Database initialized successfully');
      resolve(db);
      
    } catch (error) {
      console.error('Database initialization failed:', error);
      reject(error);
    }
  });
}

function initializeDatabaseSchema(db) {
  // 创建用户表
  const createUserTable = `
    CREATE TABLE IF NOT EXISTS users (
      id INTEGER PRIMARY KEY AUTOINCREMENT,
      username TEXT UNIQUE NOT NULL,
      password_hash TEXT NOT NULL,
      salt TEXT NOT NULL,
      created_at DATETIME DEFAULT CURRENT_TIMESTAMP,
      updated_at DATETIME DEFAULT CURRENT_TIMESTAMP
    )
  `;

  // 创建敏感数据表
  const createSensitiveDataTable = `
    CREATE TABLE IF NOT EXISTS sensitive_data (
      id INTEGER PRIMARY KEY AUTOINCREMENT,
      user_id INTEGER,
      data_key TEXT NOT NULL,
      data_value TEXT NOT NULL,
      encrypted BOOLEAN DEFAULT 1,
      created_at DATETIME DEFAULT CURRENT_TIMESTAMP,
      FOREIGN KEY (user_id) REFERENCES users (id)
    )
  `;

  // 创建审计日志表
  const createAuditLogTable = `
    CREATE TABLE IF NOT EXISTS audit_logs (
      id INTEGER PRIMARY KEY AUTOINCREMENT,
      user_id INTEGER,
      action TEXT NOT NULL,
      details TEXT,
      ip_address TEXT,
      created_at DATETIME DEFAULT CURRENT_TIMESTAMP,
      FOREIGN KEY (user_id) REFERENCES users (id)
    )
  `;

  try {
    db.exec(createUserTable);
    db.exec(createSensitiveDataTable);
    db.exec(createAuditLogTable);
    
    console.log('Database schema initialized');
  } catch (error) {
    console.error('Failed to initialize database schema:', error);
    throw error;
  }
}

module.exports = {
  initDatabase,
  generateSecureKey
};